/**
  ******************************************************************************
  * @file    lwipopts.h
  * @author  MCD Application Team
  * @version V1.1.0
  * @date    31-July-2013
  * @brief   lwIP Options Configuration.
  *          This file is based on Utilities\lwip_v1.4.1\src\include\lwip\opt.h 
  *          and contains the lwIP configuration for the STM32F4x7 demonstration.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
  *
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
  * You may not use this file except in compliance with the License.
  * You may obtain a copy of the License at:
  *
  *        http://www.st.com/software_license_agreement_liberty_v2
  *
  * Unless required by applicable law or agreed to in writing, software 
  * distributed under the License is distributed on an "AS IS" BASIS, 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
  ******************************************************************************
  */

#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__



/* 在缓冲区分配、释放以及内存分配、释放期间，对某些关键区域进行任务间保护 */
#define SYS_LIGHTWEIGHT_PROT    1

/* NO_SYS==1：提供极少的功能。否则， 使用lwIP工具 */
#define NO_SYS                  0

/* NO_SYS_NO_TIMERS==1并且NO_SYS==1时，取消对sys_timeout的支持,主要是为了与旧版本兼容 */
#define NO_SYS_NO_TIMERS        0

/* ---------- 内存选项 ---------- */
/* 应设置为编译lwIP所针对的CPU的对齐方式。4字节对齐->将MEM_ALIGNMENT定义为4，2字节对齐->将MEM_ALIGNMENT定义为2*/
#define MEM_ALIGNMENT           4

/* 堆内存的大小。如果应用程序将要发送大量需要复制的数据，这个值应该设置得高一些*/
#define MEM_SIZE                (25*1024)

/* memp结构pbuf的数量。如果应用程序从ROM（或其他静态内存）中发送大量数据，这个值应该设置得高一些 */
#define MEMP_NUM_PBUF           25
/* UDP协议控制块的数量。每个活跃的UDP“连接”对应一个 */
#define MEMP_NUM_UDP_PCB        4

/* 同时活跃的TCP连接数量*/
#define MEMP_NUM_TCP_PCB        6

/* 监听状态下的TCP连接数量 */
#define MEMP_NUM_TCP_PCB_LISTEN 6

/* 同时排队的TCP段的数量 */
#define MEMP_NUM_TCP_SEG        120

/* 同时活跃的超时数 */
#define MEMP_NUM_SYS_TIMEOUT    6


/* ---------- 数据包缓冲区选项 ---------- */
/* 数据包缓冲区池中的缓冲区数量 */
#define PBUF_POOL_SIZE          45

/* pbuf池中的每个pbuf的大小 */
#define PBUF_POOL_BUFSIZE       LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)


/* ---------- TCP 选项 ---------- */
#define LWIP_TCP                1
#define TCP_TTL                 255

/* 控制TCP是否应该将乱序到达的段进行排队。如果您的设备内存不足，请定义为0 */
#define TCP_QUEUE_OOSEQ         0

/* TCP传输控制协议最大段大小 */
#define TCP_MSS                 (1500 - 40)	  /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */

/* TCP 发送方缓冲区空间（字节） */
#define TCP_SND_BUF             (10*TCP_MSS)

/* TCP发送方缓冲区空间（pbufs）。为保证正常工作，其值必须至少为（2 * TCP_SND_BUF/TCP_MSS） */
#define TCP_SND_QUEUELEN        (5* TCP_SND_BUF/TCP_MSS)

/* TCP 接收窗口 */
#define TCP_WND                 (8*TCP_MSS)

/* ---------- ICMP 选项 ---------- */
#define LWIP_ICMP               1

/* ---------- DHCP 选项 ---------- */
/* 如果您希望对接口进行 DHCP 配置，请将 LWIP_DHCP 定义为 1。不过，lwIP 0.5.1 中未实现 DHCP，因此目前开启此功能无法正常工作 */
#define LWIP_DHCP               0

/* ---------- UDP 选项 ---------- */
#define LWIP_UDP                1
#define UDP_TTL                 255

/* ---------- 统计选项 ---------- */
#define LWIP_STATS              0
#define LWIP_PROVIDE_ERRNO      1

/* ---------- 链接回调选项 ---------- */
/* 链路发生变化（断开或连接）时，从接口调用回调函数 */
#define LWIP_NETIF_LINK_CALLBACK    1   /* 启用链路状态回调 */
#define LWIP_NETIF_STATUS_CALLBACK  0   /* 启用网络状态回调 */

/* ---------- 超时选项 ---------- */
/* 发送超时 */
#define LWIP_SO_SNDTIMEO         1
/* 接收超时 */
#define LWIP_SO_RCVTIMEO         1

/* ---------- 保活选项 ---------- */
#define LWIP_TCP_KEEPALIVE       0      /* 启用TCP保活 */
#define TCP_KEEPIDLE_DEFAULT     10000  /* 10秒空闲后开始保活 */
#define TCP_KEEPINTVL_DEFAULT    3000   /* 3秒重试间隔 */
#define TCP_KEEPCNT_DEFAULT      3      /* 最多重试3次 */



/* ---------- 校验和选项 ---------- */
/* STM32F4x7允许通过硬件计算和验证IP、UDP、TCP以及ICMP的校验和：
- 要使用此功能，请取消对以下宏定义的注释。
- 要禁用此功能并通过CPU处理，请注释掉校验和（相关定义）。
*/
#define CHECKSUM_BY_HARDWARE 

#ifdef CHECKSUM_BY_HARDWARE
    /* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP packets.*/
  	#define CHECKSUM_GEN_IP                 0
  	/* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP packets.*/
  	#define CHECKSUM_GEN_UDP                0
  	/* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP packets.*/
  	#define CHECKSUM_GEN_TCP                0 
  	/* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP packets.*/
  	#define CHECKSUM_CHECK_IP               0
  	/* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP packets.*/
  	#define CHECKSUM_CHECK_UDP              0
  	/* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP packets.*/
  	#define CHECKSUM_CHECK_TCP              0
  	/* CHECKSUM_CHECK_ICMP==0: Check checksums by hardware for incoming ICMP packets.*/
  	#define CHECKSUM_GEN_ICMP               0
#else
  	/* 在软件中为传出的IP数据包生成校验和 */
  	#define CHECKSUM_GEN_IP                 1
  	/* 为传出的UDP数据包在软件中生成校验和 */
  	#define CHECKSUM_GEN_UDP                1
  	/* 为出站TCP数据包通过软件生成校验和 */
  	#define CHECKSUM_GEN_TCP                1
  	/* 在软件中检查传入IP数据包的校验和 */
  	#define CHECKSUM_CHECK_IP               1
  	/* 对传入的UDP数据包通过软件检查校验和 */
  	#define CHECKSUM_CHECK_UDP              1
  	/* 对传入的TCP数据包在软件中检查校验和 */
  	#define CHECKSUM_CHECK_TCP              1
  	/* 通过硬件检查传入的ICMP数据包的校验和 */
  	#define CHECKSUM_GEN_ICMP               1
#endif


/* ---------- 顺序层选项 ---------- */
/* LWIP_NETCONN==1：启用Netconn API（需要使用api_lib.c） */
#define LWIP_NETCONN                    1

/* ---------- 套接字选项 ---------- */
/* LWIP_SOCKET==1：启用套接字API（需要使用sockets.c） */
#define LWIP_SOCKET                     1


/* ---------- 系统选项 ---------- */
/* UDP接收邮箱大小 */
#define DEFAULT_UDP_RECVMBOX_SIZE       10
/* TCP接收邮箱大小 */
#define DEFAULT_TCP_RECVMBOX_SIZE       10
/* TCP连接接受邮箱大小 */
#define DEFAULT_ACCEPTMBOX_SIZE         10
/* 默认线程栈大小 */
#define DEFAULT_THREAD_STACKSIZE        1024
/* LWIP线程名字 */
#define TCPIP_THREAD_NAME              "LWIP_Task"
/* LWIP线程大小 */
#define TCPIP_THREAD_STACKSIZE          512
/* LWIP邮箱大小 */
#define TCPIP_MBOX_SIZE                 8
/* LWIP线程优先级 */
#define TCPIP_THREAD_PRIO               3

/* iperf性能测试工具 */
//#define IPERF_SERVER_THREAD_NAME      "iperf_server"
//#define IPERF_SERVER_THREAD_STACKSIZE 1024
//#define IPERF_SERVER_THREAD_PRIO      0

//#define BLOCK_TIME			             250
//#define BLOCK_TIME_WAITING_FOR_INPUT	((portTickType)100)

/*
   ----------------------------------------
   ---------- Lwip Debug options ----------
   ----------------------------------------
*/
#define LWIP_DEBUG                      1

#endif /* __LWIPOPTS_H__ */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

